package com.spzx.common.security.annotation;

import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

/**
 * 自定义注解EnableRyFeignClients，用于启用Ry系统的Feign客户端功能
 * 主要目的是在Spring Boot项目中简化Feign客户端的配置和使用
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EnableFeignClients
public @interface EnableRyFeignClients
{
    /**
     * 指定具体的Feign客户端类，通常用于扫描特定的类路径
     * 默认为空数组，表示不指定任何特定的Feign客户端类
     * @return 字符串数组，包含Feign客户端的类路径
     */
    @AliasFor(annotation = EnableFeignClients.class, attribute = "value")
    String[] value() default {};

    /**
     * 指定基础包路径，Feign将会扫描这些包及其子包下的所有接口，
     * 并将它们作为Feign客户端进行处理
     * 默认值为"com.spzx"，这是项目特定的包路径
     * @return 字符串数组，包含基础包路径
     */
    @AliasFor(annotation = EnableFeignClients.class, attribute = "basePackages")
    String[] basePackages() default { "com.spzx" };

    /**
     * 指定基础包的类，作为Feign客户端扫描的起点
     * 默认为空数组，表示不指定任何特定的类
     * @return 类数组，包含作为起点的基础包类
     */
    @AliasFor(annotation = EnableFeignClients.class, attribute = "basePackageClasses")
    Class<?>[] basePackageClasses() default {};

    /**
     * 指定默认的配置类，这些配置类将应用于所有的Feign客户端
     * 默认为空数组，表示不使用任何默认配置
     * @return 类数组，包含默认的Feign客户端配置类
     */
    @AliasFor(annotation = EnableFeignClients.class, attribute = "defaultConfiguration")
    Class<?>[] defaultConfiguration() default {};

    /**
     * 直接指定Feign客户端的类，这些类将被自动配置和使用
     * 默认为空数组，表示不指定任何Feign客户端类
     * @return 类数组，包含直接指定的Feign客户端类
     */
    @AliasFor(annotation = EnableFeignClients.class, attribute = "clients")
    Class<?>[] clients() default {};
}

